package com.fantsey.test.juejin;

import java.util.ArrayList;
import java.util.List;

/**
 * 在广告平台中，为了给广告主一定的自由性和效率，允许广告主在创造标题的时候以通配符的方式进行创意提交。
 * 线上服务的时候，会根据用户的搜索词触发的 bidword 对创意中的通配符（通配符是用成对 {} 括起来的字符串，可以包含 0 个或者多个字符）进行替换 ，
 * 用来提升广告投放体验。
 * 例如：“{末日血战} 上线送 SSR 英雄，三天集齐无敌阵容！”，会被替换成“帝国时代游戏下载上线送 SSR 英雄，三天集齐无敌阵容！”。
 * 给定一个含有通配符的创意和一句标题，判断这句标题是否从该创意替换生成的。
 *
 * 输入格式
 * 第一行输入为 N，代表有 N 个标题
 * 第二行代表含有通配符的创意，创意中包含大小写英文字母和成对的花括号
 * 第三行到第 N + 2 行，代表 N 句标题，每个标题只包含大小写英文字母
 *
 * N 行，每行为“True”或者“False”，判断该句标题是否符合创意
 *
 * 输入样例
 * 4
 * ad{xyz}cdc{y}f{x}e
 * adcdcefdfeffe
 * adcdcefdfeff
 * dcdcefdfeffe
 * adcdcfe
 *
 * 输出样例
 * True
 * False
 * False
 * True
 * 说明
 * adcdcefdfeffe 可以看作 ad{}cdc{efd}f{eff}e 或者 ad{}cdc{efdfe}f{f}e 替换生成，但是无论哪种替换方式都是符合该创意 ad{xyz}cdc{y}f{x}e。
 *
 * 数据范围
 * N <= 10
 * 标题和创意的长度小于等于 100
 *
 * @author fx
 * @date 2024/12/30
 * @since 1.0
 */
public class Question7 {

    private static final String SPLIT_REGX = "{}";

    /**
     * 解题思路：
     * 1. 将创意根据{}进行分割，得到n个创意标题和通配符，并记录对应的位置
     * 2. 遍历创意的分割的创意标题，只需要匹配非通配符的创意标题，如果通配符，则跳过
     * 2.1 匹配第一个创意标题，如果不是通配符，则标题的第一个字符串必须和创意标题完全匹配，否则直接返回false
     * 2.2 匹配到最后一个创意标题后，如果不是通配符，则标题的最后一个字符必须和创意标题完全匹配，否则直接返回false
     * 2.3 其他情况，如果创意标题在标题中不存在，则返回false
     * 2.4 其他情况则说明匹配成功
     *
     */
    public static String solution(int n, String template_, String[] titles) {
        // Please write your code here
        List<String> templeTitleList = new ArrayList<>();
        splitTemplate(template_, templeTitleList);
        System.out.println(templeTitleList);
        StringBuilder result = new StringBuilder();
        for (String title : titles) {
            boolean flag = match(templeTitleList, title);
            System.out.println("title = " + title + ", flag = " + flag);
            if (flag) {
                result.append("True,");
            } else {
                result.append("False,");
            }
        }
        if (result.length() > 0) {
            result = result.deleteCharAt(result.length()-1);
        }
        return result.toString();
    }

    private static boolean match(List<String> templeTitleList, String title) {
        for (int i = 0; i < templeTitleList.size(); i++) {
            String templeTitleItem = templeTitleList.get(i);
            if (!templeTitleItem.equals(SPLIT_REGX)) {
                // 第一个
                if (i == 0) {
                    if (!title.startsWith(templeTitleList.get(i))) {
                        return false;
                    }
                }
                if (i == templeTitleList.size() -1) {
                    if (!title.endsWith(templeTitleItem)) {
                        return false;
                    } else {
                        return true;
                    }
                }
                int matchIndex = title.indexOf(templeTitleItem);
                if (matchIndex == -1) {
                    return false;
                }
                //System.out.println("title = " + title + ", matchIndex = " + matchIndex + ", templeTitleItem = " + templeTitleItem + ", remainTitle = " + title.substring(templeTitleItem.length()));
                title = title.substring(matchIndex + templeTitleItem.length());
            }

        }
        return Boolean.TRUE;
    }

    public static void splitTemplate(String template, List<String> result) {
        // {xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}
        if (template == null || template.isEmpty()) {
            return;
        }
        int i = template.indexOf("{");
        int j = template.indexOf("}");
        String resultItem = "";
        if (i != -1 && j != -1) {
            if (i==0) {
                resultItem = SPLIT_REGX;
                template = template.substring(j+1);
            } else {
                resultItem = template.substring(0, i);
                template = template.substring(i);
            }
            result.add(resultItem);
            splitTemplate(template, result);
        } else {
            result.add(template);
        }
    }



    public static void main(String[] args) {
        //  You can add more test cases here
        String[] testTitles1 = {"adcdcefdfeffe", "adcdcefdfeff", "dcdcefdfeffe", "adcdcfe"};
        String[] testTitles2 = {"CLSomGhcQNvFuzENTAMLCqxBdj", "CLSomNvFuXTASzENTAMLCqxBdj", "CLSomFuXTASzExBdj", "CLSoQNvFuMLCqxBdj", "SovFuXTASzENTAMLCq", "mGhcQNvFuXTASzENTAMLCqx"};
        String[] testTitles3 = {"abcdefg", "abefg", "efg"};

        System.out.println(solution(4, "ad{xyz}cdc{y}f{x}e", testTitles1).equals("True,False,False,True"));
        System.out.println(solution(6, "{xxx}h{cQ}N{vF}u{XTA}S{NTA}MLCq{yyy}", testTitles2).equals("False,False,False,False,False,True"));
        System.out.println(solution(3, "a{bdc}efg", testTitles3).equals("True,True,False"));


    }

}
